#ifndef SCHEDULER_H
#define SCHEDULER_H

#include <stdint.h>

// 任务状态枚举
typedef enum {
    TASK_UNUSED = 0,      // 未使用
    TASK_READY,           // 就绪态
    TASK_RUNNING,         // 运行态
    TASK_SLEEPING,        // 睡眠态(阻塞)
    TASK_ZOMBIE           // 僵尸态
} task_state_t;

// 任务控制块(TCB)
typedef struct task_struct {
    uint32_t pid;                   // 任务ID
    char name[32];                  // 任务名称
    task_state_t state;             // 任务状态
    uint32_t time_slice;            // 时间片(ms)
    uint32_t elapsed_time;          // 已消耗时间(ms)
    void (*entry)(void*);           // 任务入口函数
    void* arg;                      // 函数参数
    
    // 新增: sleep/wakeup 支持
    void* wait_channel;             // 等待通道(用于标识等待条件)
    uint32_t sleep_until;           // 睡眠到指定时间(时钟tick数)
    
    struct task_struct* next;       // 链表指针
} task_t;

// 调度器配置
#define MAX_TASKS 16                // 最大任务数

// ===== 核心接口 =====

/**
 * 初始化调度器
 */
void scheduler_init(void);

/**
 * 创建新任务
 * @param name 任务名称
 * @param entry 任务入口函数
 * @param arg 函数参数
 * @param time_slice 时间片(ms)
 * @return 任务PID,失败返回-1
 */
int create_task(const char* name, void (*entry)(void*), void* arg, uint32_t time_slice);

/**
 * 任务调度(选择下一个任务运行)
 */
void schedule(void);

/**
 * 获取当前任务
 * @return 当前任务指针
 */
task_t* get_current_task(void);

/**
 * 打印所有任务状态
 */
void print_tasks(void);

/**
 * 任务主动让出CPU(yield)
 */
void task_yield(void);

// ===== sleep/wakeup 接口 =====

/**
 * 当前任务进入睡眠(阻塞)
 * @param channel 等待通道(用于唤醒时的匹配)
 */
void task_sleep(void* channel);

/**
 * 唤醒等待在指定通道的所有任务
 * @param channel 等待通道
 */
void task_wakeup(void* channel);

/**
 * 当前任务睡眠指定时间(单位: ms)
 * @param ms 睡眠时间(毫秒)
 */
void task_sleep_ms(uint32_t ms);

/**
 * 时钟tick处理(在时钟中断中调用)
 * 用于唤醒睡眠超时的任务
 */
void scheduler_tick(void);

#endif // SCHEDULER_H

